package br.com.datasun.biblioteca.dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.com.datasun.biblioteca.dao.factory.ConnectionFactory;
import br.com.datasun.biblioteca.entities.Cidade;
import br.com.datasun.biblioteca.entities.Estado;
import br.com.datasun.biblioteca.exceptions.DAOException;

public class EstadoDAO {
	public List<Estado> listarTodosEstados() throws DAOException{
		List<Estado> resultado = new ArrayList<Estado>();
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" select e.id id_estado ");
		sql.append("       ,e.nome nome_estado ");
		sql.append("       ,e.sigla ");
		sql.append("       ,c.id id_cidade ");
		sql.append("       ,c.nome nome_cidade ");
		sql.append("   from estado e ");
		sql.append("   join cidade c on (c.id_estado = e.id) ");
		sql.append("   order by e.sigla, c.nome ");
		
		Map<Long, Estado> estadosMap = new HashMap<Long, Estado>();
		Map<Long, List<Cidade>> cidadesEstadoMap = new HashMap<Long, List<Cidade>>();
		
		try{
			//Se conecta ao banco de dados
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			
			//Consulta ao banco
			resultSet = preparedStatement.executeQuery();
			
			while (resultSet.next()){
				Long idEstado = resultSet.getLong("id_estado");
				String nomeEstado = resultSet.getString("nome_estado");
				String siglaEstado = resultSet.getString("sigla");
				 
				if (estadosMap.get(idEstado) == null){
					Estado estado = new Estado();
					estado.setId(idEstado);
					estado.setNome(nomeEstado);
					estado.setSigla(siglaEstado);
					estadosMap.put(idEstado, estado);
				}
				
				Long idCidade = resultSet.getLong("id_cidade");
				String nomeCidade = resultSet.getString("nome_cidade");
				if (idCidade != 0){
					Cidade cidade = new Cidade();
					cidade.setId(idCidade);
					cidade.setNome(nomeCidade);
					cidade.setEstado(estadosMap.get(idEstado));
					List<Cidade> cidadesEstado = cidadesEstadoMap.get(idEstado);
					
					if (cidadesEstado == null){
						cidadesEstado = new ArrayList<Cidade>();
						cidadesEstado.add(cidade);
						cidadesEstadoMap.put(idEstado,cidadesEstado);
					}else{
						cidadesEstado.add(cidade);
					}
				}
								
			}//while
			for (Estado estado : estadosMap.values()){
				List<Cidade> cidades = cidadesEstadoMap.get(estado.getId());
				estado.setCidade(cidades);
			}
			
			resultado.addAll(estadosMap.values());
		}catch (Exception e) {
			// TODO: handle exception
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		} return resultado;
	}

}
